package com.itany.shop.listener;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @author 石小俊
 * @date 2023年10月31日 10:19
 */
@WebListener
public class CountPersonListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // 由于在线人数的数据是所有人共享的
        // 因此,存储的数据必须在application中进行操作
        ServletContext application = event.getSession().getServletContext();

        // 由于该数据是由所有人共享的,因此存在并发操作
        // 此时需要考虑线程并发问题,加一把同步锁
        synchronized (this){
            // 取出application作用域中人数的值
            Integer count = (Integer) application.getAttribute("count");
            // 如果是第一个在线的人,此时作用域数据为空,应该将默认值设置为1
            if(count == null){
                count = 1;
            } else{
                // 否则,每次上线一个人,在线人数+1
                count++;
            }
            // 将新的在线人数存储到application作用域
            application.setAttribute("count",count);
        }

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        ServletContext application = event.getSession().getServletContext();
        synchronized (this){
            Integer count = (Integer) application.getAttribute("count");
            // 由于离线之前一定已经上线了,因此作用域中的值不可能为空
            // 直接-1即可
            count--;
            application.setAttribute("count",count);
        }
    }
}
